{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Quantum Process Tomography with Q# and Python #"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Abstract ##"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In this sample, we will demonstrate interoperability between Q# and Python by using the QInfer and QuTiP libraries for Python to characterize and verify quantum processes implemented in Q#.\n",
    "In particular, this sample will use *quantum process tomography* to learn about the behavior of a \"noisy\" Hadamard operation from the results of random Pauli measurements."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Preamble ##"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import warnings\n",
    "warnings.simplefilter('ignore')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can enable Q# support in Python by importing the `qsharp` package."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Preparing Q# environment...\n"
     ]
    }
   ],
   "source": [
    "import qsharp "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Once we do so, any Q# source files in the current working directory are compiled, and their namespaces are made available as Python modules.\n",
    "For instance, the `Quantum.qs` source file provided with this sample implements a `HelloWorld` operation in the `Microsoft.Quantum.Samples.Python` Q# namespace:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "// Copyright (c) Microsoft Corporation. All rights reserved.\n",
      "// Licensed under the MIT License.\n",
      "namespace Microsoft.Quantum.Samples.Python {\n",
      "    open Microsoft.Quantum.Intrinsic;\n",
      "    open Microsoft.Quantum.Canon;\n",
      "    open Microsoft.Quantum.Preparation;\n",
      "\n",
      "    function HelloWorld (pauli : Pauli) : Unit {\n",
      "        Message($\"Hello, world! {pauli}\");\n",
      "    }\n",
      "\n",
      "    operation NoisyHadamardChannelImpl (depol : Double, target : Qubit) : Unit {\n",
      "        let idxAction = Random([1.0 - depol, depol]);\n",
      "\n",
      "        if (idxAction == 0) {\n",
      "            H(target);\n",
      "        }\n",
      "        else {\n",
      "            PrepareSingleQubitIdentity(target);\n",
      "        }\n",
      "    }\n",
      "\n",
      "    function NoisyHadamardChannel (depol : Double) : (Qubit => Unit) {\n",
      "        return NoisyHadamardChannelImpl(depol, _);\n",
      "    }\n",
      "\n",
      "}\n",
      "\n",
      "\n",
      "\n"
     ]
    }
   ],
   "source": [
    "with open('Quantum.qs') as f:\n",
    "    print(f.read())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can import this `HelloWorld` operation as though it was an ordinary Python function by using the Q# namespace as a Python module:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "from Microsoft.Quantum.Samples.Python import HelloWorld"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Q# callable Microsoft.Quantum.Samples.Python.HelloWorld>"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "HelloWorld"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Once we've imported the new names, we can then ask our simulator to run each function and operation using the `simulate` method."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Hello, world! PauliZ\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "()"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "HelloWorld.simulate(pauli=qsharp.Pauli.Z)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Tomography ##"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The `qsharp` interoperability package also comes with a `single_qubit_process_tomography` function which uses the QInfer library for Python to learn the channels corresponding to single-qubit Q# operations."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "from qsharp.tomography import single_qubit_process_tomography"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Next, we import plotting support and the QuTiP library, since these will be helpful to us in manipulating the quantum objects returned by the quantum process tomography functionality that we call later."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "%matplotlib inline\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "import qutip as qt\n",
    "qt.settings.colorblind_safe = True"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "To use this, we define a new operation that takes a preparation and a measurement, then returns the result of performing that tomographic measurement on the noisy Hadamard operation that we defined in `Quantum.qs`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "experiment = qsharp.compile(\"\"\"\n",
    "open Microsoft.Quantum.Samples.Python;\n",
    "open Microsoft.Quantum.Characterization;\n",
    "\n",
    "operation Experiment(prep : Pauli, meas : Pauli) : Result {\n",
    "    return SingleQubitProcessTomographyMeasurement(prep, meas, NoisyHadamardChannel(0.1));\n",
    "}\n",
    "\"\"\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Here, we ask for 10,000 measurements from the noisy Hadamard operation that we defined above."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Preparing tomography model...\n",
      "Performing tomography...\n"
     ]
    }
   ],
   "source": [
    "estimation_results = single_qubit_process_tomography(experiment, n_measurements=10000)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "To visualize the results, it's helpful to compare to the actual channel, which we can find exactly in QuTiP."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "depolarizing_channel = sum(map(qt.to_super, [qt.qeye(2), qt.sigmax(), qt.sigmay(), qt.sigmaz()])) / 4.0\n",
    "actual_noisy_h = 0.1 * qt.to_choi(depolarizing_channel) + 0.9 * qt.to_choi(qt.hadamard_transform())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We then plot the estimated and actual channels as Hinton diagrams, showing how each acts on the Pauli operators $X$, $Y$ and $Z$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(None, <matplotlib.axes._subplots.AxesSubplot at 0x25cee978d68>)"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x25cee91fc18>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, (left, right) = plt.subplots(ncols=2, figsize=(12, 4))\n",
    "plt.sca(left)\n",
    "plt.xlabel('Estimated', fontsize='x-large')\n",
    "qt.visualization.hinton(estimation_results['est_channel'], ax=left)\n",
    "plt.sca(right)\n",
    "plt.xlabel('Actual', fontsize='x-large')\n",
    "qt.visualization.hinton(actual_noisy_h, ax=right)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We also obtain a wealth of other information as well, such as the covariance matrix over each parameter of the resulting channel.\n",
    "This shows us which parameters we are least certain about, as well as how those parameters are correlated with each other."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]),\n",
       " <a list of 16 Text xticklabel objects>)"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAnEAAAJxCAYAAAAtjeQ4AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzs3X/wJXV97/nnG8bvIEwyMoa1xKpo0IUUv2ZGKcOa3GEwSFALAdkll2hZRK9Qok5F19p8nat3BqJfR4VY66SWLEEY3as4WS4/vBKD1wi6VlJrARGYWFfMvYBW7STUTAbu1cHvzOB7/+g+w5kz53y/5/vr9Ke/5/mo+lZ3f/vX69unT593f7r7fCMzkSRJUrsc03QASZIkzZ1FnCRJUgtZxEmSJLWQRZwkSVILWcRJkiS1kEWcJElSC1nESZIktZBFnCRJUgutaDqApNGKiBOBi4HLgFOBJ4B7gK9l5j+PSwYdrZTXpZQcUunC/9ggjY+IuBM4EbiX6gPx8Yj4deASqg/NiczcuNwz9OQ5EXgbcClwGvBfGcOCoZTXpZQcdRb3jR4lbJMSMvRkaeyEwyJOGiMR8ZLMfGa+45dLhq51dRcM92Tmj5ssKJtUyutSUA73jR4lbJMSMgzI0sxJsUWcNF56zhybPJNuNEOd4yVU9wZfTHVWf8SZNDA9qoKyBAW9Lo3ncN84WgnbpIQM3VmaPuGwiJPGSNeZ419RncU2eTm1sQx9sjR+6a5ppbwuBeYY+32jo4RtUkKGnjyNnnBYxC1DJdwvUEKGniyN3yRdwjbpPjOMiGOAYzLzUL/xyznDsOsa4aU7942Cc8xn/BLkafw4VsI2KSFD17oaP+GwiFtmSrhfoIQMA7KUcrN24/fXRMT7ga3AAWAP8PnM/MKo1l9Khp48RxUMI1qv+0bBOeosjewbXesv4jjWk6nRbVJChhJOOCzilpkS7hcoIUN3lhLO2kraJnWeJ4D/KTP/KSJeDkwBT2Xm1nHK0JXlA8AWXigYtmfmLSNat/tG2Tka2ze6MhRxHOtaXwnbpPEMXVkaO+GwiFtmSjhjKyFDT54SbpIubZs8BqzNzF/Ww8cAP8jMs8cpQ1eWxgoG943ic5RSTDZ+HOvK0vg2KSFDCVks4haR9yyUk6FrXY3fs1DnKGab1Ou7Fvhd4I8z8x8j4lXAVzPz3HHK0JWlsYLBfaP4HI0Xk6Ucx7rylLBNGs9QQhaLuEVS2tl0ncl7Fgq4Z6FPpsZflzrH5cAHgbOBXwW+DHyd6uDz43HJUOcopWBw3ygsRwn7RmnHsUK2SeMZSshiEbdICjybbvx+gRIydGUp4ibpkrZJV6YVwOnAemAd1RnlG8cwQ6MFg/tGuTma3je6chRxHKuzNL5NSsjQdBaLuEXkPQvlZSgtS9M56tbhYTyTmf9tuWaYSVMFg/tGWTn6KaCYLOI41pOp8UK/hAxNZbGIWyTes1BmhtKyNJ0jIu4HEogZJktgR2Z+ablm6MpSTMHgvlFcjmL2jY4C9pHGt0kJGUrKsmIpFjqm3t19z0JErMjMnwDbge1RfY3AKN0E/N8R8ceZ+Y/ArwP7xzBDaVkazZGZ549qXSVn6PJFhiwYgCUtKHHfAMrJQVn7RkfTx7EStkkJGYrJYkvcIvOehfIylJallBxdeY7NzOdHvd6eDCszc7rJDCVw3xiYw/2jVuA+sqKAB3GOy8xfNJmhKRZxi8x7FsrNUFqWgnJ8AfhgZu6PiA2Z+d2GMnw1M//TqNfdJ8uXgKsz8xdNPL1cZ3DfODpH4/tHCftGV5ZS9pFbqPaR5zx+jH4fsYhbZN6zUEaG0rKUkqOfiHgFcANwiGpfvXGU6+/K8R5gLXB9Zu5pIkOd499TbYv3AR/NzH+3xOtz3xguS+P7x6j3ja71lr6P3AgcxOPHyPcR74lbfN6zUEaG0rKUkqOfPwF+BJwC/OWI1w1ARPwe8BvAq4FbIuKLmXlXE1movqT7C1Tv5b0jWJ/7xiwK2j9GvW90lL6P/Gc8fnSMdh/JTH8W+Qe4HHgA+BeqivyLwP8C/I8N5VlRwDY5rukM/hzxemzp6v+1unsCcEtDGa4CTuka3t7g9vj1uvsq4B+afq3Gcd8oaf9w35h1+zS2j5Swf/TJMtJ9xMupS8h7Fo7IMLb3LAyR5z9k5uUjXucvgc8Ca4CHqV6bfaO8kX1Qhnrcr+YILwvNlKVJ47pvzJSjHjey/aPUfaNJEbElM6/r8/tRHj/6ZqjHjfr4MTDLUvNy6iKZ4Z6FZ4D765+R71y1LcBtEXEQ+AEw8iIuM98TEe+JiM/T8D0LwDHAn0fE+4APA0t+X0tEvGHQKODMpV5/Hwn8ArgPeC3wtxHxrzPzkYYzXJmZP2jgPdLY9nDfmFOOJvaPUrZHX00U+sCWiDiensJ2lEX+oAwATXzGDsqy1GyJWySlfEFlPxFxK/ATqnsW/m1m/nSU668z/B7wr6haJQ8Cjd2zEBF/QnXPwlZgb2b+ryNY5+PAv+k3CviLzDx1qTP05PmHzDyja/hU4M9H2VJcQoYSsrhvmGOIDDMV+rdm5mmjylLneR74BPAYVWF7GTDSwraEDCVksSVukWQ5X1DZz/+WmXsi4gTgf6f/B8ZSeznVwea/AkTEdqCpG0//IjN/EhFbgXuBJS/iqO4X+R36F/knjGD9vfZExOsy8yGArP7DyEljmKGELO4b5pjNDgYX+jM1HCyV/5yZW+r+OyJiB/DnwCgL7BIyNJ7FIm6Z6r5G37l0mZk/j4hrGsqwo2f0vx1Vjj5ZflJ3nwTOmGm+RfQQ8Kns0/QdEf/ziDJ02wR8NSIeojp7PJvqqapxy1BCFvcNc8zGQr/MDI1n8XLqCJR0c/K4ZSglS3055LHM/O99xv1uZv7NqLJ0rXclcAHVfVd7gdsz8+fjlqHpLO4b5hhi/V8DLhlQ6P99Zq4fVZZ6nWuBr1KdgHQK21/JzLeNU4YSsljELRLvWSgzQ4lZJGkuLPTLzdB0Fou4ReLNyWVmKDGLJEmLwXviFo/3LJSZocQskiQtmEXc4vHm5DIzFJclIv4V1f/4ewr4qxF/t1JROUrIUFKWEjKYo9wcJWUpIUcJGZrOcswoVjImtgGrBoz7yCiDANT3eq0Dbq9/dT9w5bhlKClLRBwTEV8FLqYqIE8FvjXqFsEScpSQoaQsJWQwR7k5SspSQo4SMpSSxSJukWTm3/a76bQeN/KbTuv1TmfmvZn56cy8pYkbPkvIUFCWD1C1Aq4D/l+q1sA7gc+NYY4SMpSUpYQM5ig3R0lZSshRQoYisljESaNzIfBnwC3AfwH2ZeZ2qv+kMW45SshQUpYSMpij3BwlZSkhRwkZisjiPXFLoJTr9CXkKCFDQVn2AS8D3g78NfA7EfGyEWcoJUcJGUrKUkIGc5Sbo6QsJeQoIUMRWWyJW0RNXxsvKUcJGQrMcjOwHbg/M38f+BhwA3DHGOYoIUNJWUrIYI5yc5SUpYQcJWQoIovfE7eIImIT8CvAecAfADcCDwK/lZnvHKccJWQoNMtlwB8B/wz8D8A3MvPTo8xQSo4SMpSUpYQM5ig3R0lZSshRQoYSsljELaKI+DrwDuD3gL8AbsvMP4qIv83MQf/RYVnmKCFDiVm6Mv1qZv63JtZdWo4SMnSUkKWEDOYoNweUk6WEHCVk6Ggii5dTF1cp1+lLyFFChhKzAFDKQaeEHCVk6CghSwkZwBy9SskB5WQpIUcJGTqayGIRt7hKuU5fQo4SMpSY5bCIOLbJ9XeUkKOEDB0lZInq/zA2zhxHKiWH1GERt4gy8/8B/hz4g4j4S2AS2JWZfzpuOUrIUGKWHjdHxPEAEbFhzHOUkKGkLP9HRLypoXV3M8eRSslBRHwpIl5c979knHOUkKGpLN4Tt0RKuU5fQo4SMnQUluUVVC2Ch4AfZOaN45qjhAylZYmI91B9Jc71mbmniQzmKDrHv6faR98HfDQz/9245ighQ1NZbIlbIqUUCiXkKCFDR0lZgD8BfgQk8JdjnqOEDMVkiYjfA34DeDVwS/30mznM0e0JYCtwE3DCmOcoIUPHaLNkpj/++DOiH2BLV/+v1d0TgFvGLUcJGUrK0pPhKuCUruHt5hjvHH2y/HrdfRXwD+OWo4QMJWTxcuoIRMR/yMzLzVFGho4mskTEL4HPAmuAh4GvZua+iDg2R/gfJErIUUKGkrIMylCPG9ltAOYoM8dsWUaphBwlZCghi/92a5FExKDvGwvgzHHKUUKGErPUEvgFcB/wWuBvI+JfZ+YjY5ijhAwlZemX4crM/MEoCwVzFJtjUBaPH2N8/LAlbpFExOPAv+k3CviLzDx1XHKUkKHELHWef8jMM7qGTwX+PDPfOG45SshQUpYSMpij3BwlZSkhRwkZSshiS9ziOQH4HarioN+4ccpRQoYSswDsiYjXZeZDAJn5eDTw/2QLyVFChpKylJDBHOXmKClLCTlKyNB4FlviFklEfA24JPts0Ij4+8xcPy45SshQYpZ6nWuBrwIPAY8BZwO/kplvG7ccJWQoKUsJGcxRbo6SspSQo4QMJWSxiFsk9b1Xj2Xmf+8z7ncz82/GJUcJGUrM0rXelcAFVPfk7QVuz8yfj2OOEjKUlKWEDOYoN0dJWUrIUUKGprNYxC2SiDgmM3853/HLKUcJGUrLYo6yMpSUpYQM5ig3R0lZSshRQoaSsvhlv4vnP0XEzoi4MiJ+FSAijo+It0fE/0XVzDouOUrIUFoWc5SVoaQsJWQwR7k5SspSQo4SMhSTxZa4RRLVP80+DbgEeAswAfyS6pHje4BHRnSm1HiOEjKUlsUcZWUoKUsJGcxRbo6SspSQo4QMJWWxiFskEfE3wB7gbuBe4ABwLHARcClw5ogeKmg8RwkZSstijrIylJSlhAzmKDdHSVlKyFFChpKyWMQtoog4nRcq8hdRfQHgfcDXMvPhccpRQobSspijrAwlZSkhgznKzVFSlhJylJChlCwWcUskIo7LzF+Yo4wMHaVkMUdZGTpKyFJCBnOUmwPKyVJCjhIydDSRxSJOkiSphXw6VZIkqYUs4iRJklrIIk6SJKmFLOKWWERc3XQGMEcvcxzJHEcyx5HMcSRzHMkcRxplDou4pVfEToU5epnjSOY4kjmOZI4jmeNI5jiSRZwkSZIG8ytGZnD88cfnS17ykgUtY//+/Rx//PGLlMgc5jCHOczRNHOYY6lz7N69e09mnjTbdCsWtJZl7iUveQnXXHNN0zEkSdIY2bp161PDTOflVEmSpBayiJMkSWohizhJkqQWsoiTJElqIYs4SZKkFrKIkyRJaiGLOEmSpBayiJMkSWohizhJkqQWsoiTJElqIYs4SZKkFrKIkyRJaqFFLeIi4tsRsaKr+9sR8R8j4v+LiH+MiN+Z53JnXE5EPBARr5ph/hMj4q7efkmSpLZasVgLiogzgL3AacDezDwUEbuAS4GPAt+bYd4NwNXAGuCbwPbMfL5rkqGWM0hm7ouINRHx0szc290/12VJkiSVYDFb4i4B7u7qkpnP9hRjR4mIy4CPAZ8A3gGsAr7SPc0wy+lZ5rURsSsinoqID9a/vhe4uE+/JElS6yxmEfcWquKo0x3Wh4C7gOuAC4GNwE8j4rz5hIiIy4E3AeuBc4EtEbECuIeqNY+e/t75r46IByPiwf37988ngiRJ0pJblCIuIl4MTADTwERmPjPkfKuBpzPzJiCAW4A/AB4A1s4zzibgjzPzYGbuBg4Cx2Tmj6gu9dLd3yszb87MczLznOOPP36eESRJkpbWohRxmfkckMCxQEbEqiHnexY4KSLeDLwGuA24AfhN4Km55oiIFwFnZ+bj9fDLgT2ZeSAiXgk8Uf/+cL8kSVIbLebl1PuAi7q6w/oG8E7grZm5CXiQ6n61v5pHhtOB1RFxSkQcA3wK2F6Pu4TqMmpvvyRJUussZhHXuc/s8P1mEXFBRPwAeD/VpdLb+ny9x6eBh4E7I+LvqO5juyIzD3YmGHI5UN0H92XgduBR4CeZeXM97mLga336JUmSWmfRvmIkMx+KiLOAR4CzImJFZn4LWDfLfAncWP8MmmbW5dTWAV/PzJ3dv4yIE4GVmbm7u3+I5UmSJBVpUb/sNzPXZuahTncxlz2kdcAP+uTal5kbevslSZLaatFa4hq2A3gmMzc2nEOSJGkklkURl5k7ms4gSZI0Sot6OVWSJEmjYREnSZLUQhZxkiRJLWQRJ0mS1EIWcZIkSS1kESdJktRCFnGSJEktZBEnSZLUQhZxkiRJLWQRJ0mS1EIWcZIkSS1kESdJktRCFnGSJEktZBEnSZLUQhZxkiRJLWQRJ0mS1EIWcZIkSS1kESdJktRCFnGSJEktZBEnSZLUQhZxkiRJLbSi6QCSVILJyUlWrlx51O+np6fZtm1bA4kkaWYLKuIi4tvAhcA36+5vAZPA64D9wFWZ+b2FhhwixwP1up6cYZoTgVuBdwO3ZuZlS52rBP0+mPxQUmmmpqY4cODA4eGJiQk2b9480gz9CriZfi+pDCUcP5o6CZx3ERcRZwB7gdOAvZl5KCJ2AZcCHwUGFm8RsQG4GlhDVQBuz8zn55tlGJm5LyLWUF1CXhMRL83MvUu5zhL026nG+UOphDd7aToHnyaL++7XpN+wmtH7wdTkPtJ57zb5nvX4caRStkcJx4+mTgIX0hJ3CXB3V5fMfBYgIgbOFBGXAe8DNgH/DLwf+Arw+z3TrQW2A78G/CYQwPWZuWW2YBFxLXAt8CvADZm5vR51L3BxV3fHMH+oFkcJB+ES3uwdJWwPeOEgM87FfYlKKK5794km95HOe7XJ92xpxw+g0WNHSdtjXC3kwYa3UBVDne6wPgTcBVxHdQl2I/DTiDivM0FEHAfsBD6SmacDnwRuALbOtvCIuBx4E7AeOBfYEhGdYvUeqpbCTrff/FdHxIMR8eD+/fvn8GdpNiUchEvi9tBMLK4lzWZeLXER8WJgApgGJjLzmSHnWw08nZk3RcT5wC3Aq4HXA2uB79STXgA8nJnfr4cfBS7KzBxiNZuA92bmQWB3RBykLlYz80cRcVqn22/mzLwZuBng5JNPHmZ9GtLExMThlieVsz2mp6cPt/ioHL4uRyrh/dLJ0D3clHG+jKsXzKuIy8znIiKBY4GMiFWZ+bMh5ns2Ik6KiDcDrwFuo2phexT4cdekZwKPdQ2/FngYICJOAj4DfBy4HrimM1FEvAg4OzMfr4dfDuzJzAP18CuBJzrd+fztbdP5IOj9XRNKOOh4ED5aCQ+5lPS6lKKE16X3+NFkQVnC+6WEDCUp5X1bQo5+n7Wd3y+lGK5xq8+MEddTFV9nA49m5h1d4z5G9WDDod6nUyNiEjiL6lLp7ojYBFwOXFC3nhER7wXemJlXRsSpwH8E3tB5ECEirqO6T+49mfmzztOpwGrg76kKxCepnkb927p1jXpd08BKYDoz/8+Z/saTTz45r7nmmpkmkbRM+BUjkkqxdevWhzLznNmmW8iDDfdQ3d/2ubp7R0RcQNWy9jKqoiojYlfP13l8GvgwcGf9AMQTwBWdAq52O/C2+mnXPcCVXQXcKuAUqgKxt/VvPfDlev4TgDs7BVztYuBdwJfqriQBZbR8SdJczLuIy8yHIuIs4BHgrIhYkZnfAtbNMl8CN9Y/g6b5GVXBdYT6AYXPAx8DroiIjZn5QNck64CvZ+bOPvOeSNUC9wtgZWbunuVPlCRJKtaCvuw3M9fWvWtnnHCRZOYhqi/rBfhsn0nWATcNmHcfsKEe3NBvGkmSpLZYLv92awfwTGZubDiHJEnSSCyLIi4zdzSdQZIkaZQW8mW/kiRJaohFnCRJUgtZxEmSJLWQRZwkSVILWcRJkiS1kEWcJElSC1nESZIktZBFnCRJUgtZxEmSJLWQRZwkSVILWcRJkiS1kEWcJElSC1nESZIktZBFnCRJUgtZxEmSJLWQRZwkSVILWcRJkiS1kEWcJElSC1nESZIktZBFnCRJUgtZxEmSJLXQiqYDSJJUsqmpKQ4cODBw/MTEBJs3bx5hIqmyoCIuIr4NXAh8s+7+FjAJvA7YD1yVmd9baMghcjxQr+vJGaY5EbgVeDdwa2ZettS59ILJyUlWrlx5eHh6eppt27Y1mEg6Uu8+2uG+2qwSXpeZCrhhxmtp9RbZTRTV/Qr9UeSYdxEXEWcAe4HTgL2ZeSgidgGXAh8FBhZvEbEBuBpYQ1UAbs/M5+ebZRiZuS8i1lBdQl4TES/NzL1LuU69oPcg3O+gPG46H05NFwndB59xblEYtE+6rzbL10Wz6S2emiiq+61zFDkW0hJ3CXB3V5fMfBYgIgbOFBGXAe8DNgH/DLwf+Arw+z3TrQW2A78G/CYQwPWZuWW2YBFxLXAt8CvADZm5vR51L3BxV3fHMH9o23U+pMf5A7pbKduj8yHU9IdR94GmyRaFUoraUpSyn5aSQ0cq5f3i/tGshTzY8BaqYqjTHdaHgLuA66guwW4EfhoR53UmiIjjgJ3ARzLzdOCTwA3A1tkWHhGXA28C1gPnAlsiolOs3kPVUtjp9pv/6oh4MCIe3L9//xz+rHJ1Ppht8q+4PdQG7qeSZjOvlriIeDEwAUwDE5n5zJDzrQaezsybIuJ84Bbg1cDrgbXAd+pJLwAezszv18OPAhdlZg6xmk3AezPzILA7Ig5SF6uZ+aOIOK3T7TdzZt4M3Axw8sknD7O+4k1MTBw+U1I522N6evrwmXSTOtuj098UW9+OVMp+autKmUp5v7h/NGteRVxmPhcRCRwLZESsysyfDTHfsxFxUkS8GXgNcBtVC9ujwI+7Jj0TeKxr+LXAwwAR8YfAPwF/DXyB6nIs9bgXAWdn5uP18MuBPZl5oB5+JfBEpzufv72NSniTdQqW7uGmlLA9wINwaXr30e7fN8HXpVLa66LydJ+IdoabzjCqHAu5J+4+4KKu7h1DzvcN4J3AWzNzd0RsAi6nan3r2Au8ESAiTgXeDryhHvddqidMXwHsrAvKznynA6sj4hTgSeBTVPfVdVxCdSm109WIlFKwSIO4j5aphNel3wd073g1p4QTnqYyLKSIu4fq/rbP1d07IuICqpa1lwFXUbXS7er5Oo9PAx8G7qyLryeAK+rLnx23A2+rn3bdA1zZeZI0M/9LRKwHVmfmLT2Z1gNfruc/AbizvjzacTHwLuBLdVeSpBmVUCRI/cy7iMvMhyLiLOAR4KyIWJGZ3wLWzTJfAjfWP4Om+RlVwTXIIeD6Pr9fB3w9M3f2jqi/J24l8AtgZWbunimnJElSyRb0b7cyc21mHup0FyvUIBGxOiL+DPhiZj7dZ5J1wA/6zZuZ+zJzQ6e7pEElSZKWWKv+7Vb9PXQf6DNqB/BMZm4caSBJkqSGtKqIGyQzdzSdQZIkaZQWdDlVkiRJzbCIkyRJaiGLOEmSpBayiJMkSWohizhJkqQWsoiTJElqIYs4SZKkFrKIkyRJaiGLOEmSpBayiJMkSWohizhJkqQWsoiTJElqIYs4SZKkFrKIkyRJaiGLOEmSpBayiJMkSWohizhJkqQWsoiTJElqIYs4SZKkFrKIkyRJaqEVTQeQRmFycpKVK1cOHD89Pc22bdtGmEgql++XF8y2LWC8tofKYhGnsTDbQXi28cvN1NQUBw4cGDh+YmKCzZs3jzCRSuL75QXD/K3jtD10tJkK/aUu8BdUxEXEt4ELgW/W3d8CJoHXAfuBqzLzewsNOUSOB+p1PTlg/InArZl5WXf/UueSSjVTATfM+MU06ADYROtGbxZbWJpX0v6hI5Xwfhl0QjrKE9GZivilLvDnXcRFxBnAXuA0YG9mHoqIXcClwEeBgcVbRGwArgbWUBWA2zPz+flmmU1m7ouINRHx0szc292/VOssRe8ObguLSjPoINdE60bvOm1haV5J+4eOVML7ZdAJ5yhPRJu0kAcbLgHu7uqSmc/OVoxFxGXAx4BPAO8AVgFf6TPd2oj4bkT8MCJ+GREZEdcNEywiro2IXRHxVER8sP71vcDFffqXtd4duckde2pqiq1btzI1NdVYhtLcf//9TUdQwdw/NMjk5CRbtmxhcnKy6Shq0EKKuLdQFUOd7rA+BNwFXEd1CXYj8NOIOK8zQUQcB+wEPpKZpwOfBG4Ats628Ii4HHgTsB44F9gSESuAe6haCenp753/6oh4MCIe3L9//xz+LM2mU0COyxmSJC2VTquXLZLjbV5FXES8GJgApoGJzHxmyPlWA09n5k1AALcAfwA8AKztmvQC4OHM/H49/CiwJjNziNVsAv44Mw9m5m7gIHBMZv6I6tIv3f29MvPmzDwnM885/vjjh/mzNKSJiYkjuoLzzz+/6QgqmPuHBpmenj6iq/E0r3viMvO5iEjgWCAjYlVm/myI+Z6NiJMi4s3Aa4DbqFrYHgV+3DXpmcBjXcOvBR4GiIhXAu8FfqNaZL6zM1FEvAg4OzMfr4dfDuzJzAP1fE90LeOJ+fztbTMxMXHUPXFN8V48lW56evqoG7XVrN7XpPv346yEhzp8vzRvIU+n3gdc1NW9Y8j5vgG8E3hrZu6OiE3A5VStbx17gTcCRMSpwNuBNwBk5lMR8QWqy7Hv61n26cDqiDgFeBL4FLC9HncJ1WXU3v5lzcJJ/fQW9/3Gj0pJH9IlfDDqSL4m5SrhtRl0LCvhGNYZt5QWUsTdQ3V/2+fq7h0RcQFVy9rLgKuoWul29Xydx6eBDwN3RgRULWJXZObBrmluB95WP+26B7iy8yRpRLyK6t6492Xmz3syrQe+XM9/AnBnZt5cj7sYeFeffo2Bmd5knfHjpKTivoQPAh3J98sLZtsWnWnUjBKOZU0ew2K428wGzBzxCNV3wj0EvC4zDy1WsBnW+UOq1r+fA3+amf/S+Z444I+Av8vMnT3znAjck5kbuvtnW9fJJ5+c11xzzWL/CZIkSQNt3br1ocw8Z7bpFvRlv5nZeRhh7YwTLqL6adVB1gE39ZlnH7Cht1+SJKmtlsu/3doBPJOZGxvOIUmSNBLLoojLzB1NZ5AkSRqlhXzZryRJkhpiESdJktRCFnGSJEktZBEnSZLUQhZxkiRJLWQRJ0mS1EIWcZIkSS1YY48nAAAgAElEQVRkESdJktRCFnGSJEktZBEnSZLUQhZxkiRJLWQRJ0mS1EIWcZIkSS1kESdJktRCFnGSJEktZBEnSZLUQhZxkiRJLWQRJ0mS1EIWcZIkSS1kESdJktRCFnGSJEkttKLpAJIklWxqaooDBw4MHD8xMcHmzZtHmEiqLKiIi4hvAxcC3wQuzMxDi5Kq/7p+G5gEXgfsB67KzO/V4x6oh5+cYf4TgVuBdwO3ZuZlS5VVkrR4JicnWbly5eHh6elptm3bNrL1z1TADTNeS6u3yG6qqG4ix7yLuIg4A9gLnAbsXUgBFxEbgKuBNVQF4fbMfL5nsl3ApcBHge/NdR2ZuS8i1lBdQl4TES/NzL3zzay56xyIR30ALlUJ26OUgx+UsT1Upu4Crt+wxltvEd1UUd1EjoW0xF0C3N3VBSAi1gLbgV8DfhMI4PrM3NJvIRFxGfA+YBPwz8D7ga8Av989XWY+W08/a7CIuBa4FvgV4IbM3F6Puhe4uKu7Y5g/tO06H9RNN/l3DrwlHIDvv/9+zj///EYzlLA9Sjn4QRnbo6OE/aOU920pOXSkkk56zjvvPL7zne80mmFcLeTBhrdQFUOdLhFxHLAT+Ehmng58ErgB2DrDcj4E3AVcR3VpdiPw04g4bz6hIuJy4E3AeuBcYEtEdIrVe6ha8zrdfvNfHREPRsSD+/fvn08ESVqwTkHtpTpJg8yrJS4iXgxMANPARGY+U4+6AHg4M79fDz8KXJSZOWA5q4GnM/OmiDgfuAV4NfB6YC0wn9J+E/DezDwI7I6Ig9TFamb+KCJO63T7zZyZNwM3A5x88sl9c7dNKWfP09PTh88cm9Z0KwuUsT0mJiaOupzalBK2R0cJ+0fntWnyNYFyjh86UtOtb91shWvOvIq4zHwuIhI4FsiIWJWZPwPOBB7rmvS1wMMRcRLwGeDjwPXANZl5MDOfjYiTIuLNwGuA26ha7h4FfjzXXBHxIuDszHy8Hn45sCczD9TDrwSe6HTn87dr/ko66JSghO1R0gd0CdujJCW9Nk3rFPjdw1JHKSejTeRYyD1x9wEXdXXvoHrQ4Y0AEXEq8HbgDZm5NyJ+AtwIvKduJev4BvBO4K2ZuTsiNgGXU7XqzdXpwOqIOAV4EvgU1f15HZdQXUrtdCVJhbPA10xKOeFpIsdC7onrd3/Z7cCqiNhFdUnyyrqAWwWcAhyqW+y6fRp4GLgzIv6O6j62K3oKPSLigoj4AdWDD7cAt0XEXT3LWg98uc7xKPCT+vJox8XA17q6kiTNaLYWlaYveWt8zbslLjMfioizgEeAsyJiRV2gXdw9Xf1QweeBjwFXRMTGzHygazlJ1UJ34yzr+xawbpZY64CvZ+bO3hH198StBH4BrMzM3bMsS5KkYlp6pF4L+rLfzFxb966dYZpDVF+wC/DZhaxvCOuAmwbk2AdsqAc39JtGkiSpLZbLv93aATyTmRsbziFJkjQSy6KIy8wdTWeQJEkapYU82CBJkqSGWMRJkiS1kEWcJElSC1nESZIktZBFnCRJUgtZxEmSJLWQRZwkSVILWcRJkiS1kEWcJElSC1nESZIktZBFnCRJUgtZxEmSJLWQRZwkSVILWcRJkiS1kEWcJElSC1nESZIktZBFnCRJUgtZxEmSJLXQiqYDSBqNyclJVq5cOef5pqen2bZt2xIkkiQthC1x0piYTwG3kPkkSUvLljhJ0mFTU1McOHBg1ukmJibYvHnzCBJJRxvmysIoriIM835ZyveKRZzGwmxvND+QmuHrUp5hCri5TLcQ7h8aZJgrBKO4ijDM+2Ap3ytDF3ER8W3gQuCbwIWZeWjJUs1RRDwAXJWZTw4YfyJwa2Ze1t0/wohq2GxvolF8IOloJb0ugwoGC4XmlLR/6Ei+X8owVBEXEWcAe4HTgL0LKeAiYgNwNbCGqiDcnpnPz3d5w8jMfRGxJiJempl7u/uXcr2l6DQ7N32Devebftzf6L0HwHHfHiUYVBBYKKij9xJeU8fUEo4fvl/KMOyDDZcAd3d1AYiItRHx3Yj4YUT8MiIyIq4btJCIuAz4GPAJ4B3AKuArA6ad07J75r02InZFxFMR8cH61/cCF/fpX/Y6B52mb1DvfnOP+xu99+8f9+2ho01OTrJlyxYmJyebjqJa7zG0qWOqxw91DFvEvYWq8Ol0iYjjgJ3ARzLzdOCTwA3A1hmW8yHgLuA6qkuzG4GfRsR53RPNc9mdeS8H3gSsB84FtkTECuAe4NJ6su7+3vmvjogHI+LB/fv3z7Y6SZKkRsx6OTUiXgxMANPARGY+U4+6AHg4M79fDz8KXJSZOWA5q4GnM/OmiDgfuAV4NfB6YC3wna7J57TsHpuA92bmQWB3RBwEjsnMH0XEaQDd/b0y82bgZoCTTz55mPUVb3p6+vDl1CZNTEwccTl1nHVvi86w1M3v5itP51jaPdwEjx/qmLWIy8znIiKBY4GMiFWZ+TPgTOCxrklfCzwcEScBnwE+DlwPXJOZBzPz2Yg4KSLeDLwGuI2qde1R4Mc9q53TsjsTRcSLgLMz8/F6+OXAnsw8EBGvBJ6of3+4fxyU8mHgPV8vcFuUp/eDsfv3Engs7eb7pQzDPp16H3BRV/cOqgcd3ggQEacCbwfeUD848BPgRuA93UUW8A3gncBbM3N3RGwCLqdqees2n2UDnA6sjohTgCeBTwHb63GXUF1G7e3XGBh0wOker9Er6XUp4YNRagvfL2UYtoi7h+p+ts/V3TuA24G3RcQuYA9wZV1krQJOAQ7VLXbdPg18GLgzIqBqDbuiTzE2n2VDdR/cl+v5TwDurC+PQvUgw7v69GsMeMApk69LeWYrrLunazqLJ1/jq/fS9qBpltow75el3E+HKuIy86GIOAt4BDgrIlbURdQRT3jWDxB8nuoJ1CsiYmNmPtC1nKRqRbtxlvXNedm1dcDXM3Nnz7wnAivr1r/D/cP87ZI0TkoqrEvKorJ4absy9Jf9ZubaunftDNMcAt5dD352Abnmu+x1wE195t0HbOjtl8bJMGeug+aTJJVnufzbrR3AM5m5seEcUrFKOXOVJC2OZVHEZeaOpjNIkiSN0rBf9itJkqSCWMRJkiS1kEWcJElSC1nESZIktZBFnCRJUgtZxEmSJLWQRZwkSVILWcRJkiS1kEWcJElSC1nESZIktZBFnCRJUgtZxEmSJLWQRZwkSVILWcRJkiS1kEWcJElSC1nESZIktZBFnCRJUgtZxEmSJLWQRZwkSVILrWg6gKTxNDk5ycqVK2edbnp6mm3bto0gkSS1iy1xkhoxTAE3l+kkadzYEieNoampKQ4cODBw/MTEBJs3bx5homa5PSS10dBFXER8G7gQ+CZwYWYeWrJUcxQRDwBXZeaTA8afCNyamZd1948wYmN6P5zG+cNo0OW7cbxcN1PBMsz45cbtUa5BBfaoj2Wl5ChFv+NpE8fScX9dhiriIuIMYC9wGrB3IQVcRGwArgbWUBWE2zPz+fkubxiZuS8i1kTESzNzb3f/Uq63BL079zh/GA26LNfU5brug+A4FpIqXwn76KBj1qiPZaXk6Oi8Nk29Lv2Om00cS0t6XZp4vwx7T9wlwN1dXQAiYm1EfDcifhgRv4yIjIjrBi0kIi4DPgZ8AngHsAr4yoBp57TsnnmvjYhdEfFURHyw/vW9wMV9+jUik5OTbNmyhcnJyaajFKH7gOd9X+o1NTXF1q1bmZqaaiyD+2i5Oq+Hr0s5mni/DFvEvYWq8Ol0iYjjgJ3ARzLzdOCTwA3A1hmW8yHgLuA6qkuzG4GfRsR53RPNc9mdeS8H3gSsB84FtkTECuAe4NJ6su7+3vmvjogHI+LB/fv3z7Y6SVoSnZaEcW49lzSzWS+nRsSLgQlgGpjIzGfqURcAD2fm9+vhR4GLMjMHLGc18HRm3hQR5wO3AK8GXg+sBb7TNfmclt1jE/DezDwI7I6Ig8AxmfmjiDgNoLu/V2beDNwMcPLJJw+zPg3Jy4VHmp6ePqLpXeo2MTHBgQMHmJiYaCyD+2i5Oq+Nr0s5mni/zFrEZeZzEZHAsUBGxKrM/BlwJvBY16SvBR6OiJOAzwAfB64HrsnMg5n5bEScFBFvBl4D3EbVuvYo8OOe1Q5a9h8C/wT8NfAF4P2Z+Vxnooh4EXB2Zj5eD78c2JOZByLilcAT9e8P9y93nQ+C7uFx1f0G6/19EyxqNZMSbsouYR/tPYZ1/34cc3Q0/dr0O542cSwt6XVp4jUZ9unU+4CLurp3UD3o8EaAiDgVeDvwhvrBgZ8ANwLvqVvEOr4BvBN4a2bujohNwOVULW/d+i4beAnwbuAVwM7uAq52OrA6Ik4BngQ+BWyvx11CdRm1t39ZK+GDoBRNH/RKMujA1z1+nLg9ylXKMayUHKUo5Xg67q/LsEXcPVT3s32u7t4B3A68LSJ2AXuAK+sCbhVwCnCobrHr9mngw8CdEQFVa9gVPYUeg5YN7I2I9cDqzLylT871wJfr+U8A7qwvj0L1IMO7+vRLY2fcD3y93B6S2mioIi4zH4qIs4BHgLMiYkVdoB3xhGf9AMHnqZ5AvSIiNmbmA13LSaoWuhtnWd9Ry+5yiOoybT/rgK9n5s6eXCcCK+vWv8P9M2WQtLQGXd7uN50k6WhDf9lvZq6te9fOMM0hqsudAJ9dQK6j1A9GfBL4YmY+PWCydcBNfXLtAzb09ktqTimXYySprVrzb7cy81ngAwNG7wCeycyNIwskSZLUoNYUcTPJzB1NZ5AkSRqlYb/sV5IkSQWxiJMkSWohizhJkqQWsoiTJElqIYs4SZKkFrKIkyRJaiGLOEmSpBayiJMkSWohizhJkqQWsoiTJElqIYs4SZKkFrKIkyRJaiGLOEmSpBayiJMkSWohizhJkqQWsoiTJElqoRVNB5CkUZqcnGTlypULXs709DTbtm1bhESSND+2xEkaK4tRwC3mciRpvmyJkySpx9TUFAcOHJjzfBMTE2zevHkJEklHs4iTJB027OXm5X45eT4F3ELm09wMW2Qv96LaIk6SdNiwl4mX+nKyxaRmMmyxvNyLaou4ZWymg6AHPpVgtrPp5X4WrcFKKSalks2piIuIbwMXAt8ELszMQ0uSao4i4gHgqsx8coZpTgRuBd4N3JqZl40mXXNmOriN+sDXr6BsopDszTHOxeygAmqUhdNsZ8nL/SxaaqsSjh+laeLzZegiLiLOAPYCpwF7F1LARcQG4GpgDVVBuD0zn5/v8oaRmfsiYg3VE7lrIuKlmbl3KdepF/QrGps4g+5d5zifxQ8qkCycytD5QBjnEw2Vy+PH0Zr4fJnLV4xcAtzd1QUgItZGxHcj4ocR8cuIyIi4btBCIuIy4GPAJ4B3AKuArwyYdk7L7prv2ojYFRFPRcQHu0bdC1zc1ZUadf/99zcdQYXqfACM84mGZnbeeec1HUENm0sR9xaq4qfTJSKOA3YCH8nM04FPAjcAW2dYzoeAu4DrqC7NbgR+GhFH7I3zXDYRcTnwJmA9cC6wJSI6LY73AJd2dfvNf3VEPBgRD+7fv3+mVUmSJDVmqCIuIl4MTADTwERmPlOPugB4ODO/Xw8/CqzJzBywnNXA05l5ExDALcAfAA8Aa3smn9Oyu2wC/jgzD2bmbuBg5+/MzB8Bp3W6/WbOzJsz85zMPOf444+fZVXSwpx//vlNR1Chpqenj+hKvb7zne80HUENG+qeuMx8LiISOBbIiFiVmT8DzgQe65r0tcDDEXES8Bng48D1wDV1UfVsRJwUEW8GXgPcRtW69ijw457VDlr2K4H3Ar9RRct3diaIiBcBZ2fm4/Xwy4E9mXmgHn4l8ESnO8zfrsUxPT3d98GGpnOM8wfkxMTEwBuT1Tzvg1PJPH4crYnPl7k8nXofcFFX9w6qBx3eCBARpwJvB96QmXsj4ifAjcB7MvNg13K+AbwTeGtm7o6ITcDlVC1v3WZa9heoLse+r2ee04HVEXEK8CTwKWB71/hLqC6ldrrLWr/CqXvcKJXygVRKjhKU8ATZoA+C7vGSylPC8aM0TXy+zKWIu4fqfrbP1d07gNuBt0XELmAPcGVdZK0CTgEO1S123T4NfBi4MyKgahG7oqfQY4Zlv4rqvrj3ZebPe+ZZD3y5nvcE4M7MvLlr/MXAu4Av1d1lzYJFpfODQIPMdBLaO500roYu4jLzoYg4C3gEOCsiVtQF2hFPedYPEXye6gnUKyJiY2Y+0LWcpGqhu3GW9R217NpfUbUGfjQi/jQz/6Vr3Drg65m5s3em+nviVgK/AFbW98tJkrqUUjx5EqqZzNaK3z3dcjanL/vNzM7DB70PIXRPc4jqC3UBPjvPXDNlOH2G0euAmwbMtw/YUA9u6DeNJI07i6fKsEVCv/m09GzFryyXf7u1A3gmMzc2nEOStAxYJKgN5vI9ccXKzB1dX3siSQMt1mVA78WS1LTl0hInSUPxcqGk5WJZtMRJkiSNG4s4SZKkFrKIkyRJaiGLOEmSpBayiJMkSWohizhJkqQWsoiTJElqIYs4SZKkFrKIkyRJaiGLOEmSpBayiJMkSWohizhJkqQWsoiTJElqIYs4SZKkFrKIkyRJaiGLOEmSpBayiJMkSWohizhJkqQWsoiTJElqIYs4SZKkFlrRdABJkko2OTnJypUrB46fnp5m27ZtI0wkVRZUxEXEt4ELgW8CF2bmoUVJ1X9dvw1MAq8D9gNXZeb36nEP1MNPzjD/icCtwLuBWzPzsqXKKklaPFNTUxw4cODw8MTEBJs3bx7Z+mcq4IYZr+WvX6E/iuJ+3kVcRJwB7AVOA/YupICLiA3A1cAaqoJwe2Y+3zPZLuBS4KPA9+a6jszcFxFrqC4hr4mIl2bm3vlmbpPOztX02WLnQDzqA3Cp3B5HKmV7lPJ+MccLugu4fsNS0/tpv0J+FMX9Qu6JuwS4u6sLQESsjYjvRsQPI+KXEZERcd2ghUTEZcDHgE8A7wBWAV/pnS4zn+1T2A1a5rURsSsinoqID3aNuhe4uKvbb96rI+LBiHhw//79w6yueJ0dqemzxc6Bt4QD8P333990hGK2x+TkJFu2bGFycrLRHKVsj1LeL+bQTKampti6dStTU1ON52g6A4zvfrqQIu4tVMVQp0tEHAfsBD6SmacDnwRuALbOsJwPAXcB11Fdmt0I/DQizptPqIi4HHgTsB44F9gSEZ0Wx3uoWvM63aNk5s2ZeU5mnnP88cfPJ4IkSdKSm9fl1Ih4MTABTAMTmflMPeoC4OHM/H49/ChwUWbmgOWsBp7OzJsi4nzgFuDVwOuBtcB35hFvE/DezDwI7I6Ig9TFamb+KCJO63TnsexWmp6ePtzM3KSJiYnDl8uadv755zcdoZjtUcoN2aVsj1LeL+bQTEq5BaOUHOO6n86riMvM5yIigWOBjIhVmfkz4Ezgsa5JXws8HBF/CPwT8NfAF4D3Z+ZzmflsRJwUEW8GXgPcRtVy9yjw47nmiogXAWdn5uP18MuBPZl5oB5+JfBEpzufv72NSvmQLuXNXgq3x5FK2R6lvF/M8YJOgd89LHVrej/tFJG9v1tqC3k69T7goq7uHVQPOrwRICJOBd4OvAF4CdVToa8Admbmc13L+QbwTuCtmbk7IjYBl1O16s3V6cDqiDgFeBL4FLC9a/wlVJdSO11JUuGaLvD7fUD3jtd4a6qIXEgRdw/V/Wyfq7t3ALcDb4uIXcAe4Mr6CdC9EbEeWJ2Zt/Qs59PAh4E7IwKqFrIr6suhh0XEBVStdC8DrqJqAdzV81Uh64Ev1zlOAO7MzJu7xl8MvAv4Ut2VJGlGTbfySIPMu4jLzIci4izgEeCsiFhRX1Lt+9QncAi4vs9yErix/plpfd8C1s0Sax3w9czc2Tui/p64lcAvgJWZuXuWZUmSJBVrQf92KzPXZuahTrffNBGxOiL+DPhiZj69kPUNYR3wg34jMnNfZm7odJc4hyRJ0pJa8n+7lZnPAh9Y4tXsAJ7JzI1LvB5JkqQiLIv/nZqZO5rOIEmSNEoLupwqSZKkZljESZIktZBFnCRJUgtZxEmSJLWQRZwkSVILWcRJkiS1kEWcJElSC1nESZIktZBFnCRJUgtZxEmSJLWQRZwkSVILWcRJkiS1kEWcJElSC1nESZIktZBFnCRJUgtZxEmSJLWQRZwkSVILWcRJkiS10IqmA0iSyjA5OcnKlSuHnn56eppt27YtYSJJM7GIkzTWhi1cxqFgmUsBN5/ppcUyNTXFgQMHZp1uYmKCzZs3L0mGuZz0LNXxwyJOY2G2N9s4fEB3G+YAuJQHv5IMexC2YBk937caZJgCbi7TzcdcjglLdfywiNNYmO0NNG4f0MMc2Jby4CcNo5T3rcWkSjX0gw0R8e2IWNHpLmWouYqIByLiVTOMPzEi7urtlyRpNqUUk1KvoYqxiDgD2AucBuzNzEPzXWFEbACuBtYA3wS2Z+bz813eMDJzX0SsiYiXZube7v6lXG8Jes8gPWNUqbr3VffTF7aH20L9lLJ/lJJjXA3bEncJcHdXF4CIWBsR342IH0bELyMiI+K6QQuJiMuAjwGfAN4BrAK+MmDaOS27Z95rI2JXRDwVER+sf30vcHGf/t55r46IByPiwf379w+zuqL1niE2ecY4NTXF1q1bmZqaaixDSdweR+reN23ZeGEbuC3UTyn7Ryk5xtWwRdxbqAqfTpeIOA7YCXwkM08HPgncAGydYTkfAu4CrgMuBDYCP42I87onmueyO/NeDrwJWA+cC2ypL//eA1xaT9bdf4TMvDkzz8nMc44//vjZVidJktSIWS+nRsSLgQlgGpjIzGfqURcAD2fm9+vhR4GLMjMHLGc18HRm3hQR5wO3AK8GXg+sBb7TNfmclt1jE/DezDwI7I6Ig8AxmfmjiDgNoLt/uZuenj7qcmpTxuFJx7lwexype19tcj8tRWd7uC3UTyn7Ryk5xtWsRVxmPhcRCRwLZESsysyfAWcCj3VN+lrg4Yj4Q+CfgL8GvgC8PzOfy8xnI+KkiHgz8BrgNqrWtUeBH/esdtCyTwI+A3wcuB64pi7WAIiIFwFnZ+bj9fDLgT2ZeSAiXgk8Uf/+cP9y5z0Kagv31SO5PTSTUvaPUnKMq2GfMr0PuKirewfVgw5vBIiIU4G3A28AXgK8G3gFsDMzn+tazjeAdwJvzczdEbEJuJyq5a1b32XXDyX8BLgReE93AVc7HVgdEacATwKfArbX4y6huoza2y9J0kC9VzT6jZeaMGwRdw/V/Wyfq7t3ALcDb4uIXcAe4Mr6ac+9EbEeWJ2Zt/Qs59PAh4E7IwKq1rAr+hRjfZcdEauAU4BDdWtgr/XAl+v5TwDuzMyb63EXA+/q068x4EH4SBMTE0N92a/UpFLet7Y2qVRDFXGZ+VBEnAU8ApwVESvqIqrvE57AIarLnb3LSapWtBtnWd9Ry64fTvg81dOtV0TExsx8oGfWdcDXM3Nnz7wnAivr1r/D/TNl0PLiQfhI3o/3gtkKhe7pNFq+bzXIMCeinemWyrDHjs60S2HoL+3NzLV179pB09QPL3wS+GJmPr3AbL3rP0R1mRbgswMmWwfc1GfefcCG3n5JslB4wVw+lDrTS00o4US0hGPHov7nhcx8FvjAYi5zSDuAZzJzYwPrlqRloYQPJUnDK+rfZ81XZu5oOoMkSdIoDf2/UyVJklQOizhJkqQWsoiTJElqIYs4SZKkFrKIkyRJaiGLOEmSpBayiJMkSWohizhJkqQWsoiTJElqIYs4SZKkFrKIkyRJaiGLOEmSpBayiJMkSWohizhJkqQWsoiTJElqIYs4SZKkFlrRdABJkiYnJ1m5cuWClzM9Pc22bdsWIZFUPos4SVLjFqOAW8zlTE1NceDAgTnPNzExwebNmxclgzQbL6dKktRjPgXcQuaT5sOWOEmS1BpzaSVd7i2jFnHSGJrtILjcD3zdhr0Xa5zutZptm4zTtlB55tLaOYqW0SaPp15OlcbQbAe2cbokNOw9VIt1r1UbzPa3jtO2kGbT5PF06Ja4iPg2cCHwTeDCzDy0ZKnmKCIeAK7KzCcHjD8RuDUzL+vuH2HEsTborH7UZ/Ol5OiXZZxbNgadxY5Ta2Cv3m0yzttC0mBDFXERcQawFzgN2LuQAi4iNgBXA2uoCsLtmfn8fJc3jMzcFxFrIuKlmbm3u38p11uKzgdCUx8Eg87aR302X0qOfusc55aNQWep49Qa2Kv3bx/nbaGjlXIS2J1jnE9EmzTs5dRLgLu7ugBExNqI+G5E/DAifhkRGRHXDVpIRFwGfAz4BPAOYBXwlQHTzmnZPfNeGxG7IuKpiPhg/et7gYv79PfOe3VEPBgRD+7fv3+Y1RWv8wHgB4EktV8pJ4Hd6x3nE9EmDVvEvYWq8Ol0iYjjgJ3ARzLzdOCTwA3A1hmW8yHgLuA6qkuzG4GfRsR53RPNc9mdeS8H3gSsB84FtkTECuCe/7+9+421q673PP7+StmV2kkvdXiAPkCRgKmUtkxjDJO0hSABTQVswgQlRp2AAbWJxsRD46QtkWOZAU2mD5pp+NN7M0iaEJB7US9motTczE0IdIbSmICZUK4PeoehtiRY3C36nQdr7bK7u/c5e59/a62z36/kZK111m/91u/svdden/Vbfw5wS1mse/wsmbk3M9dn5vply5ZNtzpJkqRKTBviIuICoAW0gVZmnihnXQ8czMwXyulDwMrMzAH1rADezMw9QAAPA18CngfW9BQfqe4eW4HvZ+bpzDwKnAY+kJmvUpwOpnt8HLRarbOGkqTmarfbU05X0Y6q2jDupr0mLjPfjYgEzgMyIpZn5jvAlcArXUWvBg5GxNeAfwX+EXgE+GZmvpuZb0fERRFxE3AZ8BhF79oh4Pc9qx2p7k6hiDgfuCozXyunLwbeysxTEXEJ8Hr5+zPj46DqC6Lb7d0UV2kAABoWSURBVPbAGwrGsR392jLOX4CtVmvgjQ3jqvc1GefXQueqy7VndWnHOBv27tTngBu7hk9S3OhwHUBEXA58EbgG+Bvg68BHgf3dIQv4JXAH8PnMPBoRW4EtFD1v3WZSN8AqYEVEXAocAX4E7C7n3UxxGrV3XPOsLht6XdoB1bdlUHDqnr9Qqj7IqCNfE6k5qvw+HTbEPUNxPdtPyuGTwBPAFyLiMPAWcHt5t+exiFgHrMjMh3vqeQD4LvBUREDRG3ZbZp7uKTeTuqG4Du7xcvkPAU9l5t5y3mbgK33GpbFjSHjfoB7afuXGxXSvyTi9FtJ0qvw+HSrEZeZLEbEaeBlYHRFLylOqfe/wBN4D7utTTwIPlT9TrW/kuktrgWczc3/3L8tnwy0te//OjE/VBknjoepe0TryNVGdTdfz1Vt2MRv6Yb+Z2bn5oPcmhDPKmxfuB/42M9+cZdtmUvdaYE/vLzPzOLChd1ySJDWLZxLeN6f/OzUz3wa+NZd1Dln3PuBEZm6aj3VLksbLKL09vctJC2VOQ1xVMnNf1W2QJM3csNcmDlPPXLC3R02wKEKcJKnZvA5PGt2w/7FBkiRJNWKIkyRJaiBDnCRJUgMZ4iRJkhrIECdJktRAhjhJkqQG8hEjkqSxMTExMSfPo5utdrvtY1U0a/bESZLGRh0CHNSnHWo2Q5wkSVIDGeIkSZIayBAnSZLUQIY4SZKkBjLESZIkNZAhTpIkqYF8TpwkSdIQ5uo5g3P1nEB74iRJkoYwV8/3m6t67ImTJNXG5OQkp06dGnm5VqvFtm3b5qFFUn0Z4iSNJcNCPc3kPZnNcmqWmZzOXMz/4szTqZLGkmFBap6ZnIZczP/izJ44jYVhjt4W4mhtut4fe3lUB9NtL4u5Z0NqEkOc5t1UwWWhQsswR2ILcbQ2XS+OvTzjrS7habptYTH3bEhNMlKIi4hfAzcAvwJuyMz35qVVI4qI54GvZuaRKcpcCDwKfB14NDNvXZjWaapgYmjRoJA/jr2ShicNo3ebqWJb6XfAYQ/twhs6xEXEp4BjwBXAsdkEuIjYANwFrKQIhLsz8y8zrW8YmXk8IlZSXAe4MiI+nJnH5nOddVCHjV311ftFXMWX8KAgb8CX+uvdNqrYVvodUHiQsfBGubHhZuBnXUMAImJNRPw2In4XEX+NiIyInYMqiYhbgR8APwS+DCwHfjqg7Eh1dy13T0Qcjog3IuLbXbN+DmzuGvZb9q6IeDEiXjx58uR0q6q9Omzsqq/eL12/hCWpOUYJcZ+jCD+dIRHxQWA/8L3MXAXcDzwI7Jiinu8ATwM7KU7NbgL+EBEbuwvNsG4iYgvwWWAd8Blge0R0ehyfAW7pGp4jM/dm5vrMXL9s2bKpViVJklSZoUJcRFwAtIA20MrME+Ws64GDmflCOX0IWJmZOaCeFcCbmbkHCOBh4EvA88CanuIj1d1lK/D9zDydmUeB052/MzNfBa7oDKf/y5uv1WpNOa3x1m63p5yWJNXXUNfEZea7EZHAeUBGxPLMfAe4Enilq+jVwMGI+Brwr8A/Ao8A38zMdzPz7Yi4KCJuAi4DHqPoXTsE/L5ntYPqvgS4E/h40bS8o1MgIs4HrsrM18rpi4G3MvNUOX0J8HpnOMzf3nRe/6ap1OEi5FarNfDGBknn6t1mqthW2u123xsbtLBGuTv1OeDGruGTFDc6XAcQEZcDXwSuAf6G4i7QjwL7M/Pdrnp+CdwBfD4zj0bEVmALRc9bt751Z+axiHiE4nTs3T3LrAJWRMSlwBHgR8Durvk3U5xK7Qy1AAbtpDvzxslUr0Vn/rjxQON9/XaMvfPHqR3qrw7bTB0OADVaiHuG4nq2n5TDJ4EngC9ExGHgLeD28o7PYxGxDliRmQ/31PMA8F3gqYiAokfstsw83VOub90R8TGK6+Luzsw/9SyzDni8XPZDwFOZubdr/mbgK8DflUMtgDp84Uy3U+qUmW91eC1UX3XZMdalHZKmNnSIy8yXImI18DKwOiKWlKdU+97lCbwH3NenngQeKn+mWt+gun9B0Rt4b0T8ODP/2DVvLfBsZu7vXah8TtxS4M/A0vJ6OY0Jd0qSpMVmpIf9Zmbn5oPemxDOKG9euB/428x8cxZtG9SGVVPMXgvsGbDccWBDObmhXxlJ42O6U9tTLSepGsOcVem3zGI15/92KzPfBr411/VOYx9wIjM3LfB6JTWUp7bryXCtqXhW5WyL4n+nZua+qtsgSZo9w7U0vFEe9itJkjS25urU7FzVsyh64iRJkuZb3U7n2hMnSZLUQIY4SZKkBjLESZIkNZAhTpIkqYEMcZIkSQ1kiJMkjY26PL2/Lu1Qs/mIEUnS2KjbIyKk2bAnTpIkqYEMcZIkSQ1kiJMkSWogQ5wkSVIDGeIkSZIayBAnSZLUQIY4SZKkBjLESZIkNZAhTpIkqYEMcZIkSQ1kiJMkSWogQ5wkSVIDGeIkSZIaaMlsFo6IXwM3AL8CbsjM9+akVeeu598DE8C/A04CX83Mf+qa/3z5uyMDlr8QeDQzb+0en4+2SpIWp8nJSU6dOnVmutVqsW3btgpbpHE34xAXEZ8CjgFXAMdmE+AiYgNwF7CSIhDuzsy/dBU5DNwC3Av807k1TC0zj0fEyoj4cGYe6x6faZvVXBMTEyxdupR2u82uXbuqbk6l6rRT8n2ppzq8L502dFTVlu5tpd+0qlGn77GFNpueuJuBn3UNAYiINcBu4N8CnwQCuC8zt/erJCJuBe4GtgL/F/gm8FPgP3TKZObbZdmhGhYR9wD3AP8GeDAzdwM/BzYD+3rGe5e9iyJQsmLFiqHW1wSTk5MAlX6w67AzAM7sDLp3ClWow+tRp51SXd4XgI0bN3LgwIFK29DZMVW9Q6rD+9K77jp8RqpWh++Pjqq3lzp9j01MTAAs2Hsym2viPkcRhjpDIuKDwH7ge5m5CrgfeBDYMUU93wGeBnZSnJrdBPwhIjbOpFERsQX4LLAO+AywPSKWAM9Q9ObRM36WzNybmeszc/2yZctm0gTVXLvdPmsoaTC3F6m+ZtQTFxEXAC2gDbQy80Q563rgYGa+UE4fAm7MzBxQzwrgzczcExHXAg8DnwA+DawBZhLttwJ3ZuZp4GhEnAY+kJmvRsQVAN3j46IOXctVHy122I73tVqtc05DVKXdbp/pWaha1b1wUI9tFurxOe18Nrqnx10d3peOqreXOn2PLfT7MqMQl5nvRkQC5wEZEcsz8x3gSuCVrqJXAwcj4hLgTuDjxeJ5R1nP2xFxUUTcBFwGPEbRc3cI+P2o7YqI84GrMvO1cvpi4K3MPFW24fXy92fGpXFWl6AA9dopqV7q8tmoU1jQ++r0PbbQZnNN3HPAjV3DJyludLgOICIuB74IXFPeTPAIxSnTu3vq+SVwB/D5zDwaEVuBLRS9eqNaBayIiEuBI8CPKK7Pg+LavWf6jEuSNK1xDguqp9lcE9e5rqz7+rIngOURcRjYC9xeBriPUVwXd3dm/qmnngeAg8BTEfHPFNex3VaeDgUgIq6PiP9NcdPDw8BjEfF0nzatAx4v23EI+JfM3FvO2wz8fZ9xSZKkxplxT1xmvhQRq4GXgdURsaQ8pbq5T/FfUPTY3RsRP87MP3bVk8BD5c+gdf0PYO0QzVoLPJuZ+7t/WT4bbmnZ03dmfIj6JEmSamlWD/vNzDXl6Jppyq2azXpGsBbY02f9x4ENveOSJElNNasQVyP7gBOZuanidkiSJC2IRRHiMnNf1W2QJElaSLO5sUGSJEkVMcRJkiQ1kCFOkiSpgQxxkiRJDWSIkyRJaiBDnCRJUgMZ4iRJkhrIECdJktRAhjhJkqQGMsRJkiQ1kCFOkiSpgQxxkiRJDWSIkyRJaiBDnCRJUgMZ4iRJkhrIECdJktRAhjhJkqQGMsRJkiQ1kCFOkiSpgQxxkiRJDbSk6gZIkqTmmJiYYOnSpQPnt9ttdu3atYAtGl/2xEmSpKFNFeCGma+5M1JPXET8GrgB+BVwQ2a+Ny+tGlFEPA98NTOPTFHmQuBR4OvAo5l568K0rlqTk5OcOnXqzHSr1WLbtm0Vtqha/Y4gx/Wosfez0VHFZ6QO70udXg/VTx0+o+qv970Zp/dl6BAXEZ8CjgFXAMdmE+AiYgNwF7CSIhDuzsy/zLS+YWTm8YhYSdH7uDIiPpyZx+ZznXXQu1Pqt5MaJ/2OEMf1qHHQZ6GKz0gd3pc6vR510tlBVrljrMNOug6fUfXX+z6M0/syyunUm4GfdQ0BiIg1EfHbiPhdRPw1IjIidg6qJCJuBX4A/BD4MrAc+GmfciPV27PsPRFxOCLeiIhvd836ObC5a9hv2bsi4sWIePHkyZPDrE5DmpycZMeOHUxOTlbdFKkRfvOb31TdhDM7xCp3jOO8k57Kxo0bq26CekxMTLB9+3YmJiYWZH2jhLjPUYSfzpCI+CCwH/heZq4C7gceBHZMUc93gKeBnRSnZjcBf4iIM5/GGdbbWXYL8FlgHfAZYHtEdHocnwFu6RqeIzP3Zub6zFy/bNmy6VYnSZJUiaFOp0bEBUALaAOtzDxRzroeOJiZL5TTh4AbMzMH1LMCeDMz90TEtcDDwCeATwNrgAMzqbfHVuDOzDwNHI2I05RhNTNfjYgrOsNh/vama7Va51wTVxWvK5JGc+2111bdBNrt9pnTqVW3oXtacODAgekLaUEt9Gn+oUJcZr4bEQmcB2RELM/Md4ArgVe6il4NHIyIS4A7gY8Xi+cdZT1vR8RFEXETcBnwGEUP2yHg91319K0XICIuAv4z8J+A+4BvdApFxPnAVZn5Wjl9MfBWZp4qpy8BXu8Mh/nbm87gdLbenUHnd+OoN+B3/36h1eF9qdPrUSd1uEC8Dm2ow2dU/Y1zyI/hOrcgIu6jCFtXAYcy88mIuBO4LjNvj4jLgX8ArsnMYxHxcYpTpndn5p+66pkAVlOcKj0aEVuBLcD1Ze8ZU9Vbzt8JfBL4j5n5TufuVGAF8L8oAuIRirtR/2dm7i2X20rRm7gUaGfmf5vqb/7IRz6S3/jGN6YqIknSWNm+ffu0ZXbuHOoSdg2wY8eOlzJz/XTlRrkmrt/1ZE8AyyPiMLAXuL0McB+juH7trABXeoCiV+2piPhniuvWbusEuKnqBYiI5cClwHtlb2C3dcDj5fKHgH/pBLjSZuDvu4aSJGkE0/V0jVNPWNWGfsRIZr4UEauBl4HVEbGkDFH97vL8BfAccG9E/Dgz/9hVTwIPlT+D1tW33vIGhf9KcXfrbRGxKTOf7yqyFng2M/f3WfZCih64PwNLM/PodH+zJEk6Wx1Ob6sw0sN+M3NNObpmmnKrZtyiqet9j+JhvQD/pU+RtcCeAcseBzaUkxv6lZEkSWqKxfK/U/cBJzJzU8XtkCRJWhCLIsRl5r6q2yBJkrSQRrmxQZIkSTVhiJMkSWogQ5wkSVIDGeIkSZIayBAnSZLUQIY4SZKkBjLESZIkNZAhTpIkqYEMcZIkSQ1kiJMkSWogQ5wkSVIDGeIkSZIayBAnSZLUQIY4SZKkBjLESZIkNZAhTpIkqYEMcZIkSQ20pOoGSJIkTWdiYoKlS5fOePl2u82uXbvmsEXVM8RJktTHqKFhMYaEOplNgJuL5evIECdprE1OTnLq1Klpy7VaLbZt27YALapWXV6POrRj1J3+YgwJqjdDnDSGhulhGJdehWGCwijlmq4ur0dd2iFNZZiDjfk80BgpxEXEr4EbgF8BN2Tme/PSqhFFxPPAVzPzyBRlLgQeBb4OPJqZty5M61QXgza2celh6TZMj8FC9Sr4vkhqqmEOIubzQGPoEBcRnwKOAVcAx2YT4CJiA3AXsJIiEO7OzL/MtL5hZObxiFhJcUfuyoj4cGYem8911kHvDrKqHWMd2jFoQ6riSL4Or0dd1Ol9kZqgLt8fvT3649J7XyejPGLkZuBnXUMAImJNRPw2In4XEX+NiIyInYMqiYhbgR8APwS+DCwHftqn3Ej19ix7T0Qcjog3IuLbXbN+DmzuGi56vTvCqnaMdWlHXfh6aDoTExNs376diYmJqpuimqnL90dvb73XBC68UULc5yjCT2dIRHwQ2A98LzNXAfcDDwI7pqjnO8DTwE6KU7ObgD9ExMZOgRnW21l2C/BZYB3wGWB7RHR6HJ8Bbuka9lv+roh4MSJePHny5HSrk6R50dkhumOUNMhQIS4iLgBaQBtoZeaJctb1wMHMfKGcPgSszMwcUM8K4M3M3AME8DDwJeB5YE1X0ZHq7bEV+H5mns7Mo8Dpzt+Zma8CV3SG/RbOzL2ZuT4z1y9btmyI1UmSJC28oUJcZr4LJHAekBGxvJx1JfBKV9GrgYMRcUlE/DAiHo+I/95Vz9vARRFxE3AZ8BhFD9sngTe66ulbL0BEfC0iborCo2XApJx3PnBVZr5WTl8MvJWZp8rpS4DXO8Nh/nZpPrRarSmnpXa7fdZQ6qjL90fvZ9PP6sIb5e7U54Abu4ZPUtzocB1ARFwOfBG4JjOPRcQjFKdM7+6p55fAHcDnM/NoRGwFtlD0vnX0rbec91uKO0w/CuzPzHcjorPcKmBFRFwKHAF+BOzuqvdmilOpneGi12q1zrkAdlzb0duGKtsyrjcx9FOn96VOvEBcg9Tl+8PPaPVGCXHPUFzP9pNy+CTwBPCFiDgMvAXcXga4j1Fcv3Z3Zv6pp54HgO8CT5Xh63Xgtsw83VWmb70Amfl/ImIdsCIzH+6pex3weLn8h4CnMnNv1/zNwFeAvyuHi15dNvY6tKMObdC5fF8kaWaGDnGZ+VJErAZeBlZHxJLMfIf+d3n+gqLH7t6I+HFm/rGrngQeKn8GrWtQvR3vAff1+f1a4NnM3N87o3xO3FLgz8DS8no5aSy12+2hHvY7Dgb1BPYrJ0ndhvn+mM/vjpEe9puZnZsP1kxTbtWMWzSF8saI+4G/zcw3+xRZC+wZ0KbjwIZyckO/MtK48DTI++wJPFtdQm1d2iFNpervj0b9263yxohv9Zm1DziRmZsWtEGStMhUvVPqqEM7humx7i0vLaRGhbhBMnNf1W2QJC0u9ljXy6ihut/yi82iCHGSJGlxM1Sfa5T/2CBJkqSaMMRJkiQ1kCFOkiSpgQxxkiRJDWSIkyRJaiBDnCRJUgMZ4iRJkhrIECdJktRAhjhJkqQGMsRJkiQ1kCFOkiSpgQxxkiRJDWSIkyRJaiBDnCRJUgMZ4iRJkhpoSdUNkCSpLiYmJli6dOms62m32+zatWsOWiQNZoiTJKk0FwFuLutR/cw26M9lwPd0qiRJ0pBmG9DnMuAb4iRJkhrI06mSpDOGPVXkNV9S9Qxx0hianJzk1KlTA+e3Wi22bdu2gC1SXQx7qmchrvnyc6pBpvtswHh8PgxxGhtT9TCMW6/CdF9+082XFoKfUw0yzHs/Dp+PkUJcRPwauAH4FXBDZr43L60aUUQ8D3w1M48MmH8h8Ghm3to9voBNrMSg0FJFYOl31LTQR0lT9Rws9J1kva/HOBwxNkHvNlPFtlKn7VZSvQ0d4iLiU8Ax4Arg2GwCXERsAO4CVlIEwt2Z+ZeZ1jedzDweESsj4sOZeax7fL7WWQeDgkkVt773OyIah6OkQXr/9nF+LTq6w0tVgaV326hiW6nTdiup3ka5O/Vm4GddQwAiYk1E/DYifhcRf42IjIidgyqJiFuBHwA/BL4MLAd+2qfcSPX2LHtPRByOiDci4tvlr38ObO4z3rvsXRHxYkS8ePLkyWFWJ2kOdIcUA4s0vY0bN1bdBCYmJti+fTsTExNVN2UsjRLiPkcRfjpDIuKDwH7ge5m5CrgfeBDYMUU93wGeBnZSnJrdBPwhIs58GmdYb2fZLcBngXXAZ4DtEbEEeAa4pSzWPX6WzNybmeszc/2yZcumW50kSVIlhjqdGhEXAC2gDbQy80Q563rgYGa+UE4fAm7MzBxQzwrgzczcExHXAg8DnwA+DawBDsyk3h5bgTsz8zRwNCJOAx/IzFcj4gqA7nGpCq1W65xr4sZdu90+63Rq1W2osh3SMA4cODB9oXnmdZrVGirEZea7EZHAeUBGxPLMfAe4Enilq+jVwMGIuAS4E/h4sXjeUdbzdkRcFBE3AZcBj1H0sB0Cft9VT996AQbVXc47H7gqM18rpy8G3srMU+Vyr3fV8fowf3uT9e6Qun+/0HpDS+d348qbGM5Vh51BHdpQp+1WUr2Ncnfqc8CNXcMnKW50uA4gIi4HvghcU9488AjFKdO7e+r5JXAH8PnMPBoRW4EtFL1vHX3rBcjMN6aoexWwIiIuBY4APwJ2l/NupjiN2ju+aNVhh9RRh9AyaOfYmSfVQZ2226r1O/jrnS+Ns1FC3DMU17P9pBw+CTwBfCEiDgNvAbeXAe5jFNev3Z2Zf+qp5wHgu8BTEQFFj9ht5enPjr71AkxT9zrg8XL5DwFPZebect5m4Ct9xjUm3Dm+z52jmqAOB3+qp+m+wzplFruhQ1xmvhQRq4GXgdURsaQ8pdrvLs9fUPTY3RsRP87MP3bVk8BD5c+gdQ2qd8q6gbXAs5m5v3uB8tlwS8uevzPj0/3N0mLlzlGDTNVj3VtOqorfYYWRHvabmWvK0TXTlFs14xZN34ap6l4L7OmzzHFgQ++4JOls9lhLzbFY/u3WPuBEZm6quB2SJGkRG7a3eqrl58qiCHGZua/qNkiSmm+2O+juerQ41am3elGEOEmS5kKddtDSdEb5jw2SJEmqCUOcJElSAxniJEmSGsgQJ0mS1ECGOEmSpAYyxEmSJDVQFP8FS/1ExP8D3qi6HZIkaaxckpkXTVfIECdJktRAnk6VJElqIEOcJElSAxniJEmSGsgQJ0mS1ECGOEmSpAYyxEmSJDWQIU6SJKmBDHGSJEkNZIiTJElqoP8PUKoMJUhMzvIAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x25ceea764e0>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(10, 10))\n",
    "estimation_results['posterior'].plot_covariance()\n",
    "plt.xticks(rotation=90)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Diagnostics ##"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      ".NET Runtime        .NETCoreApp,Version=v3.1\n",
      "Jupyter Core        1.3.52077.0\n",
      "iqsharp             0.11.2004.2825\n",
      "qsharp              0.11.2004.2825\n"
     ]
    }
   ],
   "source": [
    "for component, version in sorted(qsharp.component_versions().items(), key=lambda x: x[0]):\n",
    "    print(f\"{component:20}{version}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "3.7.3 | packaged by conda-forge | (default, Jul  1 2019, 22:01:29) [MSC v.1900 64 bit (AMD64)]\n"
     ]
    }
   ],
   "source": [
    "import sys\n",
    "print(sys.version)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
